package com.atguigu.gmall.mq.consumer;

import com.atguigu.gmall.mq.config.DeadLetterExchange;
import com.atguigu.gmall.mq.config.DelayedMqConfig;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * 接收消息
 */
@Component
@Slf4j
public class ConsumerMessage {

    //接收消息
    @RabbitListener(queues = {"queue1"})
    public void receiverMessage(Message message,String msg, Channel channel){
        try {
            int i = 1/0;
            //正常代码
            try {
                //参数1：消息的标识
                //参数2：是否将当前消息放回队列   true:放回  false:不放回 （删除）
                channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
            } catch (IOException ie) {
                ie.printStackTrace();
            }
        } catch (Exception e) {
            //e.printStackTrace();
            //允许重新发送一次
            //1:判断是否为重新的消息 (第二次)
            if(message.getMessageProperties().isRedelivered()){
                //2: 是 （第二次）
                try {
                    //参数1：消息的标识
                    //参数2：是否将当前消息放回队列   true:放回  false:不放回 （删除）
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                    log.error("消息体:{}" + msg);
                } catch (IOException ie) {
                    ie.printStackTrace();
                }
            }else{
                //3:否 （第一次）
                //参数1：消息的标识
                //参数2：是否批量
                //参数3：是否将当前消息放回队列   true:放回  false:不放回 （删除）
                try {
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),
                            false,true);
                    //表示 处理失败的时候 可以放回队列 让队列再发一次
                    //恢复 重新放回队列 再来一次
                    //channel.basicRecover(true);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

        }
        System.out.println("接收到的消息：" + msg);
    }
    //接收延迟消息
    @RabbitListener(queues = DeadLetterExchange.queue_dead_2)
    public void receiverDelayMessage(String msg){
        System.out.println("结束时间："  + new Date());
        System.out.println(msg);
    }
    //基于插件的延迟消息
    @RabbitListener(queues = DelayedMqConfig.queue_delay_1)
    public void receiverDelayMessagePlu(String msg){
        System.out.println("结束时间："  + new Date());
        System.out.println(msg);
    }
}
